package com.premize.grco.presentation.backEndBeans;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.TimeZone;

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.ValueChangeEvent;
import javax.faces.model.DataModel;

import com.icesoft.faces.async.render.RenderManager;
import com.icesoft.faces.async.render.Renderable;
import com.icesoft.faces.component.ext.HtmlCommandButton;
import com.icesoft.faces.component.ext.HtmlInputText;
import com.icesoft.faces.component.selectinputdate.SelectInputDate;
import com.icesoft.faces.context.DisposableBean;
import com.icesoft.faces.webapp.xmlhttp.FatalRenderingException;
import com.icesoft.faces.webapp.xmlhttp.PersistentFacesState;
import com.icesoft.faces.webapp.xmlhttp.RenderingException;
import com.icesoft.faces.webapp.xmlhttp.TransientRenderingException;
import com.premize.grco.exceptions.ExceptionMessages;
import com.premize.grco.movil.GrcoPUsuario;
import com.premize.grco.movil.dto.GrcoPUsuarioDTO;
import com.premize.grco.presentation.businessDelegate.BusinessDelegatorView;
import com.premize.grco.utilities.DataPage;
import com.premize.grco.utilities.DataSource;
import com.premize.grco.utilities.PagedListDataModel;
import com.premize.grco.utilities.Utilities;


/**
*
*
* @author Zathura Code Generator http://code.google.com/p/zathura
*
*/
public class GrcoPUsuarioView extends DataSource implements Renderable,
    DisposableBean {
    private HtmlInputText txtPassword;
    private HtmlInputText txtRol;
    private HtmlInputText txtUsuario;
    private HtmlInputText txtUsuarioCreacion;
    private HtmlInputText txtUsuarioModifica;
    private HtmlInputText txtConsUsuario;
    private SelectInputDate txtFechaCreacion;
    private SelectInputDate txtFechaModifica;
    private HtmlCommandButton btnSave;
    private HtmlCommandButton btnModify;
    private HtmlCommandButton btnDelete;
    private HtmlCommandButton btnClear;
    private boolean renderDataTable;
    private boolean flag = true;
    private RenderManager renderManager;
    private PersistentFacesState state = PersistentFacesState.getInstance();
    private List<GrcoPUsuario> grcoPUsuario;
    private List<GrcoPUsuarioDTO> grcoPUsuarioDTO;

    public GrcoPUsuarioView() {
        super("");
    }

    public String action_clear() {
        txtPassword.setValue(null);
        txtPassword.setDisabled(true);
        txtRol.setValue(null);
        txtRol.setDisabled(true);
        txtUsuario.setValue(null);
        txtUsuario.setDisabled(true);
        txtUsuarioCreacion.setValue(null);
        txtUsuarioCreacion.setDisabled(true);
        txtUsuarioModifica.setValue(null);
        txtUsuarioModifica.setDisabled(true);
        txtFechaCreacion.setValue(null);
        txtFechaCreacion.setDisabled(true);
        txtFechaModifica.setValue(null);
        txtFechaModifica.setDisabled(true);
        txtConsUsuario.setValue(null);
        txtConsUsuario.setDisabled(false);
        btnSave.setDisabled(true);
        btnDelete.setDisabled(true);
        btnModify.setDisabled(true);
        btnClear.setDisabled(false);

        return "";
    }

    public void listener_txtId(ValueChangeEvent event) {
        if ((event.getNewValue() != null) && !event.getNewValue().equals("")) {
            GrcoPUsuario entity = null;

            try {
                Long consUsuario = new Long(txtConsUsuario.getValue().toString());
                entity = BusinessDelegatorView.getGrcoPUsuario(consUsuario);
            } catch (Exception e) {
                // TODO: handle exception
            }

            if (entity == null) {
                txtPassword.setDisabled(false);
                txtRol.setDisabled(false);
                txtUsuario.setDisabled(false);
                txtUsuarioCreacion.setDisabled(false);
                txtUsuarioModifica.setDisabled(false);
                txtFechaCreacion.setDisabled(false);
                txtFechaModifica.setDisabled(false);
                txtConsUsuario.setDisabled(false);
                btnSave.setDisabled(false);
                btnDelete.setDisabled(true);
                btnModify.setDisabled(true);
                btnClear.setDisabled(false);
            } else {
                txtFechaCreacion.setValue(entity.getFechaCreacion());
                txtFechaCreacion.setDisabled(false);
                txtFechaModifica.setValue(entity.getFechaModifica());
                txtFechaModifica.setDisabled(false);
                txtPassword.setValue(entity.getPassword());
                txtPassword.setDisabled(false);
                txtRol.setValue(entity.getRol());
                txtRol.setDisabled(false);
                txtUsuario.setValue(entity.getUsuario());
                txtUsuario.setDisabled(false);
                txtUsuarioCreacion.setValue(entity.getUsuarioCreacion());
                txtUsuarioCreacion.setDisabled(false);
                txtUsuarioModifica.setValue(entity.getUsuarioModifica());
                txtUsuarioModifica.setDisabled(false);
                txtConsUsuario.setValue(entity.getConsUsuario());
                txtConsUsuario.setDisabled(true);
                btnSave.setDisabled(true);
                btnDelete.setDisabled(false);
                btnModify.setDisabled(false);
                btnClear.setDisabled(false);
            }
        }
    }

    public String action_save() {
        try {
            BusinessDelegatorView.saveGrcoPUsuario((((txtConsUsuario.getValue()) == null) ||
                (txtConsUsuario.getValue()).equals("")) ? null
                                                        : new Long(
                    txtConsUsuario.getValue().toString()),
                (((txtFechaCreacion.getValue()) == null) ||
                (txtFechaCreacion.getValue()).equals("")) ? null
                                                          : (Date) txtFechaCreacion.getValue(),
                (((txtFechaModifica.getValue()) == null) ||
                (txtFechaModifica.getValue()).equals("")) ? null
                                                          : (Date) txtFechaModifica.getValue(),
                (((txtPassword.getValue()) == null) ||
                (txtPassword.getValue()).equals("")) ? null
                                                     : new String(
                    txtPassword.getValue().toString()),
                (((txtRol.getValue()) == null) ||
                (txtRol.getValue()).equals("")) ? null
                                                : new Long(
                    txtRol.getValue().toString()),
                (((txtUsuario.getValue()) == null) ||
                (txtUsuario.getValue()).equals("")) ? null
                                                    : new String(
                    txtUsuario.getValue().toString()),
                (((txtUsuarioCreacion.getValue()) == null) ||
                (txtUsuarioCreacion.getValue()).equals("")) ? null
                                                            : new String(
                    txtUsuarioCreacion.getValue().toString()),
                (((txtUsuarioModifica.getValue()) == null) ||
                (txtUsuarioModifica.getValue()).equals("")) ? null
                                                            : new String(
                    txtUsuarioModifica.getValue().toString()));
            FacesContext.getCurrentInstance()
                        .addMessage("",
                new FacesMessage(ExceptionMessages.ENTITY_SUCCESFULLYSAVED));
        } catch (Exception e) {
            FacesContext.getCurrentInstance()
                        .addMessage("", new FacesMessage(e.getMessage()));
        }

        action_clear();

        return "";
    }

    public String action_delete() {
        try {
            BusinessDelegatorView.deleteGrcoPUsuario((((txtConsUsuario.getValue()) == null) ||
                (txtConsUsuario.getValue()).equals("")) ? null
                                                        : new Long(
                    txtConsUsuario.getValue().toString()));
            FacesContext.getCurrentInstance()
                        .addMessage("",
                new FacesMessage(ExceptionMessages.ENTITY_SUCCESFULLYDELETED));
        } catch (Exception e) {
            FacesContext.getCurrentInstance()
                        .addMessage("", new FacesMessage(e.getMessage()));
        }

        action_clear();

        return "";
    }

    public String action_modify() {
        try {
            BusinessDelegatorView.updateGrcoPUsuario((((txtConsUsuario.getValue()) == null) ||
                (txtConsUsuario.getValue()).equals("")) ? null
                                                        : new Long(
                    txtConsUsuario.getValue().toString()),
                (((txtFechaCreacion.getValue()) == null) ||
                (txtFechaCreacion.getValue()).equals("")) ? null
                                                          : (Date) txtFechaCreacion.getValue(),
                (((txtFechaModifica.getValue()) == null) ||
                (txtFechaModifica.getValue()).equals("")) ? null
                                                          : (Date) txtFechaModifica.getValue(),
                (((txtPassword.getValue()) == null) ||
                (txtPassword.getValue()).equals("")) ? null
                                                     : new String(
                    txtPassword.getValue().toString()),
                (((txtRol.getValue()) == null) ||
                (txtRol.getValue()).equals("")) ? null
                                                : new Long(
                    txtRol.getValue().toString()),
                (((txtUsuario.getValue()) == null) ||
                (txtUsuario.getValue()).equals("")) ? null
                                                    : new String(
                    txtUsuario.getValue().toString()),
                (((txtUsuarioCreacion.getValue()) == null) ||
                (txtUsuarioCreacion.getValue()).equals("")) ? null
                                                            : new String(
                    txtUsuarioCreacion.getValue().toString()),
                (((txtUsuarioModifica.getValue()) == null) ||
                (txtUsuarioModifica.getValue()).equals("")) ? null
                                                            : new String(
                    txtUsuarioModifica.getValue().toString()));
            FacesContext.getCurrentInstance()
                        .addMessage("",
                new FacesMessage(ExceptionMessages.ENTITY_SUCCESFULLYMODIFIED));
        } catch (Exception e) {
            FacesContext.getCurrentInstance()
                        .addMessage("", new FacesMessage(e.getMessage()));
        }

        action_clear();

        return "";
    }

    public String action_modifyWitDTO(Long consUsuario, Date fechaCreacion,
        Date fechaModifica, String password, Long rol, String usuario,
        String usuarioCreacion, String usuarioModifica)
        throws Exception {
        try {
            BusinessDelegatorView.updateGrcoPUsuario(consUsuario,
                fechaCreacion, fechaModifica, password, rol, usuario,
                usuarioCreacion, usuarioModifica);
            renderManager.getOnDemandRenderer("GrcoPUsuarioView").requestRender();
            FacesContext.getCurrentInstance()
                        .addMessage("",
                new FacesMessage(ExceptionMessages.ENTITY_SUCCESFULLYMODIFIED));
        } catch (Exception e) {
            //renderManager.getOnDemandRenderer("GrcoPUsuarioView").requestRender();
            FacesContext.getCurrentInstance()
                        .addMessage("", new FacesMessage(e.getMessage()));
            throw e;
        }

        return "";
    }

    public List<GrcoPUsuario> getGrcoPUsuario() {
        if (flag) {
            try {
                grcoPUsuario = BusinessDelegatorView.getGrcoPUsuario();
                flag = false;
            } catch (Exception e) {
                flag = true;
                FacesContext.getCurrentInstance()
                            .addMessage("", new FacesMessage(e.getMessage()));
            }
        }

        return grcoPUsuario;
    }

    public boolean isFlag() {
        return flag;
    }

    public void setGrcoPUsuario(List<GrcoPUsuario> grcoPUsuario) {
        this.grcoPUsuario = grcoPUsuario;
    }

    public boolean isRenderDataTable() {
        try {
            if (flag) {
                if (BusinessDelegatorView.findTotalNumberGrcoPUsuario() > 0) {
                    renderDataTable = true;
                } else {
                    renderDataTable = false;
                }
            }

            flag = false;
        } catch (Exception e) {
            renderDataTable = false;
            e.printStackTrace();
        }

        return renderDataTable;
    }

    public DataModel getData() {
        state = PersistentFacesState.getInstance();

        if (onePageDataModel == null) {
            onePageDataModel = new LocalDataModel(pageSize);
        }

        return onePageDataModel;
    }

    /**
    * This is where the Object data is retrieved from the database and
    * returned as a list of objects for display in the UI.
    */
    private DataPage<GrcoPUsuario> getDataPage(int startRow, int pageSize) {
        // Retrieve the total number of objects from the database.  This
        // number is required by the DataPage object so the paginator will know
        // the relative location of the page data.
        int totalNumberGrcoPUsuario = 0;

        try {
            totalNumberGrcoPUsuario = BusinessDelegatorView.findTotalNumberGrcoPUsuario()
                                                           .intValue();
        } catch (Exception e) {
            FacesContext.getCurrentInstance()
                        .addMessage("", new FacesMessage(e.getMessage()));
        }

        // Calculate indices to be displayed in the ui.
        int endIndex = startRow + pageSize;

        if (endIndex > totalNumberGrcoPUsuario) {
            endIndex = totalNumberGrcoPUsuario;
        }

        try {
            grcoPUsuario = BusinessDelegatorView.findPageGrcoPUsuario(sortColumnName,
                    sortAscending, startRow, endIndex - startRow);

            // Remove this Renderable from the existing render groups.
            //leaveRenderGroups();        			
        } catch (Exception e) {
            FacesContext.getCurrentInstance()
                        .addMessage("", new FacesMessage(e.getMessage()));
        }

        // Add this Renderable to the new render groups.
        //joinRenderGroups();
        // Reset the dirtyData flag.
        onePageDataModel.setDirtyData(false);
        // This is required when using Hibernate JPA.  If the EntityManager is not
        // cleared or closed objects are cached and stale objects will show up
        // in the table.
        // This way, the detached objects are reread from the database.
        // This call is not required with TopLink JPA, which uses a Query Hint
        // to clear the l2 cache in the DAO.
        //EntityManagerHelper.getEntityManager().clear();
        flag = true;

        return new DataPage<GrcoPUsuario>(totalNumberGrcoPUsuario, startRow,
            grcoPUsuario);
    }

    public DataModel getDataDTO() {
        state = PersistentFacesState.getInstance();

        if (onePageDataModel == null) {
            onePageDataModel = new LocalDataModelDTO(pageSize);
        }

        return onePageDataModel;
    }

    /**
    * This is where the Object data is retrieved from the database and
    * returned as a list of objects for display in the UI.
    */
    private DataPage<GrcoPUsuarioDTO> getDataPageDTO(int startRow, int pageSize) {
        // Retrieve the total number of objects from the database.  This
        // number is required by the DataPage object so the paginator will know
        // the relative location of the page data.
        int totalNumberGrcoPUsuario = 0;

        try {
            totalNumberGrcoPUsuario = BusinessDelegatorView.findTotalNumberGrcoPUsuario()
                                                           .intValue();
        } catch (Exception e) {
            FacesContext.getCurrentInstance()
                        .addMessage("", new FacesMessage(e.getMessage()));
        }

        // Calculate indices to be displayed in the ui.
        int endIndex = startRow + pageSize;

        if (endIndex > totalNumberGrcoPUsuario) {
            endIndex = totalNumberGrcoPUsuario;
        }

        try {
            grcoPUsuario = BusinessDelegatorView.findPageGrcoPUsuario(sortColumnName,
                    sortAscending, startRow, endIndex - startRow);

            if (Utilities.validationsList(grcoPUsuario)) {
                grcoPUsuarioDTO = new ArrayList<GrcoPUsuarioDTO>();

                for (GrcoPUsuario grcoPUsuarioTmp : grcoPUsuario) {
                    GrcoPUsuarioDTO grcoPUsuarioDTO2 = new GrcoPUsuarioDTO();
                    grcoPUsuarioDTO2.setConsUsuario(grcoPUsuarioTmp.getConsUsuario()
                                                                   .toString());
                    grcoPUsuarioDTO2.setFechaCreacion(grcoPUsuarioTmp.getFechaCreacion());
                    grcoPUsuarioDTO2.setFechaModifica(grcoPUsuarioTmp.getFechaModifica());
                    grcoPUsuarioDTO2.setPassword((grcoPUsuarioTmp.getPassword() != null)
                        ? grcoPUsuarioTmp.getPassword().toString() : null);
                    grcoPUsuarioDTO2.setRol((grcoPUsuarioTmp.getRol() != null)
                        ? grcoPUsuarioTmp.getRol().toString() : null);
                    grcoPUsuarioDTO2.setUsuario((grcoPUsuarioTmp.getUsuario() != null)
                        ? grcoPUsuarioTmp.getUsuario().toString() : null);
                    grcoPUsuarioDTO2.setUsuarioCreacion((grcoPUsuarioTmp.getUsuarioCreacion() != null)
                        ? grcoPUsuarioTmp.getUsuarioCreacion().toString() : null);
                    grcoPUsuarioDTO2.setUsuarioModifica((grcoPUsuarioTmp.getUsuarioModifica() != null)
                        ? grcoPUsuarioTmp.getUsuarioModifica().toString() : null);
                    grcoPUsuarioDTO2.setGrcoPUsuario(grcoPUsuarioTmp);
                    grcoPUsuarioDTO2.setGrcoPUsuarioView(this);
                    grcoPUsuarioDTO.add(grcoPUsuarioDTO2);
                }
            }

            // Remove this Renderable from the existing render groups.
            leaveRenderGroups();
        } catch (Exception e) {
            FacesContext.getCurrentInstance()
                        .addMessage("", new FacesMessage(e.getMessage()));
        }

        // Add this Renderable to the new render groups.
        joinRenderGroups();
        // Reset the dirtyData flag.
        onePageDataModel.setDirtyData(false);
        // This is required when using Hibernate JPA.  If the EntityManager is not
        // cleared or closed objects are cached and stale objects will show up
        // in the table.
        // This way, the detached objects are reread from the database.
        // This call is not required with TopLink JPA, which uses a Query Hint
        // to clear the l2 cache in the DAO.
        //EntityManagerHelper.getEntityManager().clear();
        flag = true;

        return new DataPage<GrcoPUsuarioDTO>(totalNumberGrcoPUsuario, startRow,
            grcoPUsuarioDTO);
    }

    protected boolean isDefaultAscending(String sortColumn) {
        return true;
    }

    /**
    * This method is called when a render call is made from the server. Render
    * calls are only made to views containing an updated record. The data is
    * marked as dirty to trigger a fetch of the updated record from the
    * database before rendering takes place.
    */
    public PersistentFacesState getState() {
        onePageDataModel.setDirtyData();

        return state;
    }

    /**
    * This method is called from faces-config.xml with each new session.
    */
    public void setRenderManager(RenderManager renderManager) {
        this.renderManager = renderManager;
    }

    public void renderingException(RenderingException arg0) {
        if (arg0 instanceof TransientRenderingException) {
        } else if (arg0 instanceof FatalRenderingException) {
            // Remove from existing Customer render groups.
            leaveRenderGroups();
        }
    }

    /**
    * Remove this Renderable from existing uiCustomerBeans render groups.
    * OnDemandRenderers are named/created using the underlying Customer Number.
    */
    private void leaveRenderGroups() {
        if (Utilities.validationsList(grcoPUsuarioDTO)) {
            for (GrcoPUsuarioDTO grcoPUsuarioTmp : grcoPUsuarioDTO) {
                renderManager.getOnDemandRenderer("GrcoPUsuarioView")
                             .remove(this);
            }
        }
    }

    /**
    * Add this Renderable to the new uiCustomerBeans render groups.
    * OnDemandRenderers are named/created using the underlying Customer Number.
    */
    private void joinRenderGroups() {
        if (Utilities.validationsList(grcoPUsuarioDTO)) {
            for (GrcoPUsuarioDTO grcoPUsuarioTmp : grcoPUsuarioDTO) {
                renderManager.getOnDemandRenderer("GrcoPUsuarioView").add(this);
            }
        }
    }

    public void dispose() throws Exception {
    }

    public RenderManager getRenderManager() {
        return renderManager;
    }

    public void setState(PersistentFacesState state) {
        this.state = state;
    }

    public HtmlInputText getTxtPassword() {
        return txtPassword;
    }

    public void setTxtPassword(HtmlInputText txtPassword) {
        this.txtPassword = txtPassword;
    }

    public HtmlInputText getTxtRol() {
        return txtRol;
    }

    public void setTxtRol(HtmlInputText txtRol) {
        this.txtRol = txtRol;
    }

    public HtmlInputText getTxtUsuario() {
        return txtUsuario;
    }

    public void setTxtUsuario(HtmlInputText txtUsuario) {
        this.txtUsuario = txtUsuario;
    }

    public HtmlInputText getTxtUsuarioCreacion() {
        return txtUsuarioCreacion;
    }

    public void setTxtUsuarioCreacion(HtmlInputText txtUsuarioCreacion) {
        this.txtUsuarioCreacion = txtUsuarioCreacion;
    }

    public HtmlInputText getTxtUsuarioModifica() {
        return txtUsuarioModifica;
    }

    public void setTxtUsuarioModifica(HtmlInputText txtUsuarioModifica) {
        this.txtUsuarioModifica = txtUsuarioModifica;
    }

    public SelectInputDate getTxtFechaCreacion() {
        return txtFechaCreacion;
    }

    public void setTxtFechaCreacion(SelectInputDate txtFechaCreacion) {
        this.txtFechaCreacion = txtFechaCreacion;
    }

    public SelectInputDate getTxtFechaModifica() {
        return txtFechaModifica;
    }

    public void setTxtFechaModifica(SelectInputDate txtFechaModifica) {
        this.txtFechaModifica = txtFechaModifica;
    }

    public HtmlInputText getTxtConsUsuario() {
        return txtConsUsuario;
    }

    public void setTxtConsUsuario(HtmlInputText txtConsUsuario) {
        this.txtConsUsuario = txtConsUsuario;
    }

    public HtmlCommandButton getBtnSave() {
        return btnSave;
    }

    public void setBtnSave(HtmlCommandButton btnSave) {
        this.btnSave = btnSave;
    }

    public HtmlCommandButton getBtnModify() {
        return btnModify;
    }

    public void setBtnModify(HtmlCommandButton btnModify) {
        this.btnModify = btnModify;
    }

    public HtmlCommandButton getBtnDelete() {
        return btnDelete;
    }

    public void setBtnDelete(HtmlCommandButton btnDelete) {
        this.btnDelete = btnDelete;
    }

    public HtmlCommandButton getBtnClear() {
        return btnClear;
    }

    public void setBtnClear(HtmlCommandButton btnClear) {
        this.btnClear = btnClear;
    }

    public void setRenderDataTable(boolean renderDataTable) {
        this.renderDataTable = renderDataTable;
    }

    public void setFlag(boolean flag) {
        this.flag = flag;
    }

    public List<GrcoPUsuarioDTO> getGrcoPUsuarioDTO() {
        return grcoPUsuarioDTO;
    }

    public void setGrcoPUsuarioDTO(List<GrcoPUsuarioDTO> grcoPUsuarioDTO) {
        this.grcoPUsuarioDTO = grcoPUsuarioDTO;
    }

    public TimeZone getTimeZone() {
        return java.util.TimeZone.getDefault();
    }

    /**
    * A special type of JSF DataModel to allow a datatable and datapaginator
    * to page through a large set of data without having to hold the entire
    * set of data in memory at once.
    * Any time a managed bean wants to avoid holding an entire dataset,
    * the managed bean declares this inner class which extends PagedListDataModel
    * and implements the fetchData method. fetchData is called
    * as needed when the table requires data that isn't available in the
    * current data page held by this object.
    * This requires the managed bean (and in general the business
    * method that the managed bean uses) to provide the data wrapped in
    * a DataPage object that provides info on the full size of the dataset.
    */
    private class LocalDataModel extends PagedListDataModel {
        public LocalDataModel(int pageSize) {
            super(pageSize);
        }

        public DataPage<GrcoPUsuario> fetchPage(int startRow, int pageSize) {
            // call enclosing managed bean method to fetch the data
            return getDataPage(startRow, pageSize);
        }
    }

    private class LocalDataModelDTO extends PagedListDataModel {
        public LocalDataModelDTO(int pageSize) {
            super(pageSize);
        }

        public DataPage<GrcoPUsuarioDTO> fetchPage(int startRow, int pageSize) {
            // call enclosing managed bean method to fetch the data
            return getDataPageDTO(startRow, pageSize);
        }
    }
}
